---
title: Operations
summary: Operation catalog for the SOAP service host, with per-contract detail pages.
status: draft
owner: SAIF Doc Gen
last_reviewed: 2026-09-22
---

# Operations

This host publishes 24 operations across six independent service classes: `FileService` (5), `PreferenceService` (3), `WebContextService` (3), `ImagingService` (2), `FaxService` (1), and `SecurityService` (10). Each service class's operations are documented in full on its own page under `contracts/`; this page is the catalog and hub.

This page is the operation catalog and hub. Each service class's operations are documented in detail on its own page under `contracts/`.

## Operation surface derivation

| Aspect | Finding |
| --- | --- |
| Authoritative surface | Route registrations + implementing class public members |
| Contract assembly | `SAIF.Services.WCF.Contracts` — external |
| `[OperationContract]` visible in repository | No — contract assembly is external |
| Operation naming | Method name |
| Metadata document | `?wsdl` published |

Because the six `[ServiceContract]` interfaces are not present in this repository, the operation names, parameters, and return types below are read from each service class's public members and cross-checked against the route registrations in `src/WCF/SAIF.Services.WCF.Host/Global.asax.cs`. Any `[OperationContract]` name override, `[FaultContract]` declaration, or `IsOneWay` setting present on the external interface could not be inspected; that limitation is a finding, not an omission, and is repeated on [Architecture](architecture.md) and [Operations and processes](operations-processes.md).

## Service class catalog

| Service class | Route | Contract | Operations | Documentation |
| --- | --- | --- | --- | --- |
| `SAIF.Services.WCF.Services.FileService` | `FileService` | `IFileService` — external | 5 | [Details](contracts/file-service.md) |
| `SAIF.Services.WCF.Services.PreferenceService` | `PreferenceService` | `IPreferenceService` — external | 3 | [Details](contracts/preference-service.md) |
| `SAIF.Services.WCF.Services.WebContextService` | `WebContext` | `IWebContextService` — external | 3 | [Details](contracts/web-context-service.md) |
| `SAIF.Services.WCF.Services.ImagingService` | `Imaging` | `IImagingService` — external | 2 | [Details](contracts/imaging-service.md) |
| `SAIF.Services.WCF.Services.FaxService` | `Fax` | `IFaxService` — external | 1 | [Details](contracts/fax-service.md) |
| `SAIF.Services.WCF.Services.Security.SecurityService` | `Security` | `ISecurityService` — external | 10 | [Details](contracts/security-service.md) |

## Contract assembly

| Aspect | Finding |
| --- | --- |
| Assembly | `SAIF.Services.WCF.Contracts` |
| Location | External to this repository |
| Referenced by | `SAIF.Services.WCF.Host` (transitively, via `SAIF.Framework.Core` 2.0.22181.2) |
| Contract interfaces | `IFileService`, `IPreferenceService`, `IWebContextService`, `IImagingService`, `IFaxService`, `ISecurityService` |
| Inspected | No — resolved by name from the transitive package closure |

## Operation catalog

| Operation | Service class | Input message | Output message | Faults | Auth | Rules |
| --- | --- | --- | --- | --- | --- | --- |
| [`ReadFile`](contracts/file-service.md#readfile) | `SAIF.Services.WCF.Services.FileService` | `string` `path`, `int` `byteLength` | `byte[]` | Filesystem exception (`IOException`, `UnauthorizedAccessException`, `FileNotFoundException`) | [None in code](authentication-authorization.md#authorization-enforcement) | [BR-WCF-003](business-rules.md#br-wcf-003-readfile-returns-a-fixed-length-buffer), [BR-WCF-004](business-rules.md#br-wcf-004-file-operations-trust-the-caller-supplied-path) |
| [`ReadEntireFile`](contracts/file-service.md#readentirefile) | `SAIF.Services.WCF.Services.FileService` | `string` `path` | `byte[]` | Filesystem exception | [None in code](authentication-authorization.md#authorization-enforcement) | [BR-WCF-004](business-rules.md#br-wcf-004-file-operations-trust-the-caller-supplied-path) |
| [`WriteFile`](contracts/file-service.md#writefile) | `SAIF.Services.WCF.Services.FileService` | `string` `path`, `byte[]` `bytes` | void | Filesystem exception | [None in code](authentication-authorization.md#authorization-enforcement) | [BR-WCF-004](business-rules.md#br-wcf-004-file-operations-trust-the-caller-supplied-path) |
| [`DeleteFile`](contracts/file-service.md#deletefile) | `SAIF.Services.WCF.Services.FileService` | `string` `path` | void | Filesystem exception | [None in code](authentication-authorization.md#authorization-enforcement) | [BR-WCF-004](business-rules.md#br-wcf-004-file-operations-trust-the-caller-supplied-path) |
| [`Length`](contracts/file-service.md#length) | `SAIF.Services.WCF.Services.FileService` | `string` `path` | `long` | Filesystem exception | [None in code](authentication-authorization.md#authorization-enforcement) | [BR-WCF-004](business-rules.md#br-wcf-004-file-operations-trust-the-caller-supplied-path) |
| [`GetPreferences`](contracts/preference-service.md#getpreferences) | `SAIF.Services.WCF.Services.PreferenceService` | `string` `applicationName`, `string` `pageName`, `string` `user` | `IDictionary<string, string>` | Oracle/NHibernate exception | [None in code](authentication-authorization.md#authorization-enforcement) | [BR-WCF-002](business-rules.md#br-wcf-002-per-request-configuration-and-connection-resolution), [BR-WCF-005](business-rules.md#br-wcf-005-preference-keys-are-case-normalized) |
| [`SavePreferences`](contracts/preference-service.md#savepreferences) | `SAIF.Services.WCF.Services.PreferenceService` | `string` `applicationName`, `string` `pageName`, `string` `user`, `IDictionary<string, string>` `preferences`, `string` `currentUser` | void | `ArgumentNullException` (missing `currentUser`) | [None in code](authentication-authorization.md#authorization-enforcement) | [BR-WCF-002](business-rules.md#br-wcf-002-per-request-configuration-and-connection-resolution), [BR-WCF-005](business-rules.md#br-wcf-005-preference-keys-are-case-normalized) |
| [`GetDefaultPrinter`](contracts/preference-service.md#getdefaultprinter) | `SAIF.Services.WCF.Services.PreferenceService` | `string` `user` | `string` | Directory exception | [None in code](authentication-authorization.md#authorization-enforcement) | [BR-WCF-012](business-rules.md#br-wcf-012-unknown-user-has-no-default-printer), [BR-WCF-013](business-rules.md#br-wcf-013-default-printer-comes-from-an-ad-attribute) |
| [`Get`](contracts/web-context-service.md#get) | `SAIF.Services.WCF.Services.WebContextService` | `string` `applicationName`, `string` `sessionId` | `IWebContext` | `ArgumentNullException` | [None in code](authentication-authorization.md#authorization-enforcement) | [BR-WCF-002](business-rules.md#br-wcf-002-per-request-configuration-and-connection-resolution), [BR-WCF-014](business-rules.md#br-wcf-014-web-context-operations-require-identifying-arguments) |
| [`Save`](contracts/web-context-service.md#save) | `SAIF.Services.WCF.Services.WebContextService` | `string` `applicationName`, `string` `sessionId`, `IWebContext` `context` | void | `ArgumentNullException` | [None in code](authentication-authorization.md#authorization-enforcement) | [BR-WCF-002](business-rules.md#br-wcf-002-per-request-configuration-and-connection-resolution), [BR-WCF-011](business-rules.md#br-wcf-011-persisted-changes-stamp-a-local-timestamp) |
| [`CreateContext`](contracts/web-context-service.md#createcontext) | `SAIF.Services.WCF.Services.WebContextService` | `string` `contextId` | `IWebContext` | None declared | [None in code](authentication-authorization.md#authorization-enforcement) | [BR-WCF-015](business-rules.md#br-wcf-015-context-identity-comes-from-a-stored-pid-or-a-new-guid) |
| [`QueueImage`](contracts/imaging-service.md#queueimage) | `SAIF.Services.WCF.Services.ImagingService` | `byte[]` `file`, `string` `fileExtension`, `ImageConfig` `imageConfig`, `ApplicationEnvironment` `environment`, `ImageTaskConfig` `taskConfig` | `long` | `ArgumentNullException` | [None in code](authentication-authorization.md#authorization-enforcement) | [BR-WCF-002](business-rules.md#br-wcf-002-per-request-configuration-and-connection-resolution), [BR-WCF-004](business-rules.md#br-wcf-004-file-operations-trust-the-caller-supplied-path) |
| [`ReserveImageId`](contracts/imaging-service.md#reserveimageid) | `SAIF.Services.WCF.Services.ImagingService` | None | `long` | Oracle/NHibernate exception | [None in code](authentication-authorization.md#authorization-enforcement) | [BR-WCF-024](business-rules.md#br-wcf-024-image-id-reserved-before-any-file-write) |
| [`SendFax`](contracts/fax-service.md#sendfax) | `SAIF.Services.WCF.Services.FaxService` | `SAIF.Core.Services.Documents.FaxConfig` `config` | void | `ArgumentNullException` | [None in code](authentication-authorization.md#authorization-enforcement) | [BR-WCF-002](business-rules.md#br-wcf-002-per-request-configuration-and-connection-resolution), [BR-WCF-004](business-rules.md#br-wcf-004-file-operations-trust-the-caller-supplied-path) |
| [`IsAuthorized`](contracts/security-service.md#isauthorized) | `SAIF.Services.WCF.Services.Security.SecurityService` | `string` `userId`, `string` `role` | `bool` | `SecurityException` (uncategorized) | [None in code](authentication-authorization.md#authorization-enforcement) | [BR-WCF-018](business-rules.md#br-wcf-018-external-ldap-host-falls-back-to-a-literal-default), [BR-WCF-023](business-rules.md#br-wcf-023-required-arguments-are-presence-checked-before-work) |
| [`IsAuthorized2`](contracts/security-service.md#isauthorized2) | `SAIF.Services.WCF.Services.Security.SecurityService` | `string` `userId`, `string` `role`, `bool` `tryInternalDomainFirst` | `bool` | `SecurityException` (uncategorized) | [None in code](authentication-authorization.md#authorization-enforcement) | [BR-WCF-018](business-rules.md#br-wcf-018-external-ldap-host-falls-back-to-a-literal-default), [BR-WCF-023](business-rules.md#br-wcf-023-required-arguments-are-presence-checked-before-work) |
| [`GetUser`](contracts/security-service.md#getuser) | `SAIF.Services.WCF.Services.Security.SecurityService` | `string` `userId` | `User` | Directory or Oracle/NHibernate exception | [None in code](authentication-authorization.md#authorization-enforcement) | [BR-WCF-018a](business-rules.md#br-wcf-018a-unmatched-user-is-returned-as-non-existent), [BR-WCF-019a](business-rules.md#br-wcf-019a-external-user-active-and-locked-state-derived-from-one-flag) |
| [`GetSaifUserByUserId`](contracts/security-service.md#getsaifuserbyuserid) | `SAIF.Services.WCF.Services.Security.SecurityService` | `string` `userId` | `SaifUser` | Directory exception | [None in code](authentication-authorization.md#authorization-enforcement) | [BR-WCF-024a](business-rules.md#br-wcf-024a-manager-user-id-comes-from-a-second-directory-lookup), [BR-WCF-025a](business-rules.md#br-wcf-025a-saif-domain-user-carries-directory-only-attributes) |
| [`GetSaifUserByEmployeeId`](contracts/security-service.md#getsaifuserbyemployeeid) | `SAIF.Services.WCF.Services.Security.SecurityService` | `string` `employeeId` | `SaifUser` | Directory or Oracle/NHibernate exception | [None in code](authentication-authorization.md#authorization-enforcement) | [BR-WCF-023a](business-rules.md#br-wcf-023a-employee-id-lookup-falls-back-to-the-adp-projection), [BR-WCF-028a](business-rules.md#br-wcf-028a-adp-employee-active-only-when-status-is-a) |
| [`GetUserIdForEmployeeId`](contracts/security-service.md#getuseridforemployeeid) | `SAIF.Services.WCF.Services.Security.SecurityService` | `string` `employeeId` | `string` | Oracle/NHibernate exception | [None in code](authentication-authorization.md#authorization-enforcement) | [BR-WCF-022a](business-rules.md#br-wcf-022a-missing-employee-resolves-to-an-empty-user-id), [BR-WCF-032](business-rules.md#br-wcf-032-every-security-operation-logs-its-request) |
| [`GetExternalUser`](contracts/security-service.md#getexternaluser) | `SAIF.Services.WCF.Services.Security.SecurityService` | `string` `userId` | `ExternalUser` | Oracle/NHibernate exception | [None in code](authentication-authorization.md#authorization-enforcement) | [BR-WCF-019a](business-rules.md#br-wcf-019a-external-user-active-and-locked-state-derived-from-one-flag), [BR-WCF-020a](business-rules.md#br-wcf-020a-injured-worker-status-from-primary-user-type-code) |
| [`GetExternalUserByCustomerId`](contracts/security-service.md#getexternaluserbycustomerid) | `SAIF.Services.WCF.Services.Security.SecurityService` | `string` `customerId`, `string` `userType` | `ExternalUser` | Oracle/NHibernate exception | [None in code](authentication-authorization.md#authorization-enforcement) | [BR-WCF-019a](business-rules.md#br-wcf-019a-external-user-active-and-locked-state-derived-from-one-flag), [BR-WCF-020a](business-rules.md#br-wcf-020a-injured-worker-status-from-primary-user-type-code) |
| [`GetInjuredWorkerUserByCustomerId`](contracts/security-service.md#getinjuredworkeruserbycustomerid) | `SAIF.Services.WCF.Services.Security.SecurityService` | `string` `customerId` | `ExternalUser` | Oracle/NHibernate exception | [None in code](authentication-authorization.md#authorization-enforcement) | [BR-WCF-019a](business-rules.md#br-wcf-019a-external-user-active-and-locked-state-derived-from-one-flag), [BR-WCF-020a](business-rules.md#br-wcf-020a-injured-worker-status-from-primary-user-type-code) |
| [`GetUsersByGroup`](contracts/security-service.md#getusersbygroup) | `SAIF.Services.WCF.Services.Security.SecurityService` | `string` `groupName`, `string` `ldap`, `string` `domain`, `bool` `recurse`, `bool` `includeDisabled` | `string[]` | Directory exception | [None in code](authentication-authorization.md#authorization-enforcement) | [BR-WCF-032](business-rules.md#br-wcf-032-every-security-operation-logs-its-request), [BR-WCF-035](business-rules.md#br-wcf-035-missing-group-returns-null-not-empty-array) |

## Dispatch diagram

The following diagram visualizes how a caller reaches a handling operation.

```mermaid
flowchart TD
    REQ["SOAP request"] --> ROUTE{"Route match"}
    ROUTE -->|"/FileService"| FS["FileService"]
    ROUTE -->|"/PreferenceService"| PS["PreferenceService"]
    ROUTE -->|"/WebContext"| WC["WebContextService"]
    ROUTE -->|"/Imaging"| IM["ImagingService"]
    ROUTE -->|"/Fax"| FX["FaxService"]
    ROUTE -->|"/Security"| SEC["SecurityService"]
    ROUTE -->|"No match"| NF["HTTP 404<br>no service at address"]
    FS --> OPSEL{"Operation selected<br>by SOAP action"}
    PS --> OPSEL
    WC --> OPSEL
    IM --> OPSEL
    FX --> OPSEL
    SEC --> OPSEL
    OPSEL -->|"Known operation"| NOAUTH["No authorization check<br>None in code"]
    OPSEL -->|"Unknown action"| ACTFAULT["ActionNotSupported fault"]
    NOAUTH --> OP["Operation body executes"]
    OP --> OK["Response message"]
    OP --> FAULT["SOAP fault<br>see Faults and error pipeline"]
```

## Operations by process

Operations that delegate to a documented processing workflow link to it here.

| Operation | Process |
| --- | --- |
| [`ReadFile`](contracts/file-service.md#readfile) | [OP-001](operations/file-readfile.md) |
| [`ReadEntireFile`](contracts/file-service.md#readentirefile) | [OP-002](operations/file-readentirefile.md) |
| [`WriteFile`](contracts/file-service.md#writefile) | [OP-003](operations/file-writefile.md) |
| [`DeleteFile`](contracts/file-service.md#deletefile) | [OP-004](operations/file-deletefile.md) |
| [`Length`](contracts/file-service.md#length) | [OP-005](operations/file-length.md) |
| [`GetPreferences`](contracts/preference-service.md#getpreferences) | [OP-006](operations/preference-getpreferences.md) |
| [`SavePreferences`](contracts/preference-service.md#savepreferences) | [OP-007](operations/preference-savepreferences.md) |
| [`GetDefaultPrinter`](contracts/preference-service.md#getdefaultprinter) | [OP-008](operations/preference-getdefaultprinter.md) |
| [`Get`](contracts/web-context-service.md#get) | [OP-009](operations/web-context-get.md) |
| [`Save`](contracts/web-context-service.md#save) | [OP-010](operations/web-context-save.md) |
| [`CreateContext`](contracts/web-context-service.md#createcontext) | [OP-011](operations/web-context-createcontext.md) |
| [`QueueImage`](contracts/imaging-service.md#queueimage) | [OP-012](operations/imaging-queueimage.md) |
| [`ReserveImageId`](contracts/imaging-service.md#reserveimageid) | [OP-013](operations/imaging-reserveimageid.md) |
| [`SendFax`](contracts/fax-service.md#sendfax) | [OP-014](operations/fax-sendfax.md) |
| [`IsAuthorized`](contracts/security-service.md#isauthorized) | [OP-015](operations/security-isauthorized.md) |
| [`IsAuthorized2`](contracts/security-service.md#isauthorized2) | [OP-016](operations/security-isauthorized2.md) |
| [`GetUser`](contracts/security-service.md#getuser) | [OP-017](operations/security-getuser.md) |
| [`GetSaifUserByUserId`](contracts/security-service.md#getsaifuserbyuserid) | [OP-018](operations/security-getsaifuserbyuserid.md) |
| [`GetSaifUserByEmployeeId`](contracts/security-service.md#getsaifuserbyemployeeid) | [OP-019](operations/security-getsaifuserbyemployeeid.md) |
| [`GetUserIdForEmployeeId`](contracts/security-service.md#getuseridforemployeeid) | [OP-020](operations/security-getuseridforemployeeid.md) |
| [`GetExternalUser`](contracts/security-service.md#getexternaluser) | [OP-021](operations/security-getexternaluser.md) |
| [`GetExternalUserByCustomerId`](contracts/security-service.md#getexternaluserbycustomerid) | [OP-022](operations/security-getexternaluserbycustomerid.md) |
| [`GetInjuredWorkerUserByCustomerId`](contracts/security-service.md#getinjuredworkeruserbycustomerid) | [OP-023](operations/security-getinjuredworkeruserbycustomerid.md) |
| [`GetUsersByGroup`](contracts/security-service.md#getusersbygroup) | [OP-024](operations/security-getusersbygroup.md) |

## Coverage

| Check | Result |
| --- | --- |
| Service classes registered in the route table | 6 |
| Service classes with a `contracts/` page | 6 |
| Public operations across all service classes | 24 |
| Rows in the operation catalog | 24 |

## Related documentation
- [Index](index.md)
- [Overview](overview.md)
- [Architecture](architecture.md)
- [Activation and hosting](activation-hosting.md)
- [Faults and error pipeline](faults.md)
- [Authentication and authorization](authentication-authorization.md)
- [Dependencies](dependencies.md)
- [Configuration](configuration.md)
- [Operations and processes](operations-processes.md)
- [Business rules](business-rules.md)
- [Data model](data-model.md)
- [Operational runbook](operational-runbook.md)
- [Tech debt](tech-debt.md)

## Sources
- src/WCF/SAIF.Services.WCF.Host/Global.asax.cs
- src/WCF/SAIF.Services.WCF.Host/Services/FileService.cs
- src/WCF/SAIF.Services.WCF.Host/Services/PreferenceService.cs
- src/WCF/SAIF.Services.WCF.Host/Services/WebContextService.cs
- src/WCF/SAIF.Services.WCF.Host/Services/ImagingService.cs
- src/WCF/SAIF.Services.WCF.Host/Services/FaxService.cs
- src/WCF/SAIF.Services.WCF.Host/Services/Security/SecurityService.cs
